package com.vecspace.data.model.reflect;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ReflectUtil {
	
	private static double zero_double = 0;
	private static float zero_float = 0;
	private static int zero_int = 0;
	private static long zero_long = 0;
	private static byte zero_byte = 0;
	private static short zero_short = 0; 
	
	/**
	 * 获取实例化的默认值(实体类会返回默认构造函数构造的实例，而不是返回null)。
	 * 功能描述：
	 * @param clazz
	 * @return 
	 * @throws  
	 * @throws Exception
	 */
	public static Object getDefaultValue(Class<?> clazz) throws Exception{
		if(clazz.equals(String.class)) {
			return new String();
		}
		else if(clazz.equals(int.class) || clazz.equals(Integer.class)) {
			return zero_int;
		}
		else if(clazz.equals(long.class) || clazz.equals(Long.class)) {
			return zero_long;
		}
		else if(clazz.equals(char.class) || clazz.equals(Character.class)) {
			return ' ';
		}
		else if(clazz.equals(double.class) || clazz.equals(Double.class)) {
			return Double.valueOf(zero_double);
		}
		else if(clazz.equals(float.class) || clazz.equals(Float.class)) {
			return Float.valueOf(zero_float);
		}
		else if(clazz.equals(short.class) || clazz.equals(Short.class)) {
			return Short.valueOf(zero_short);
		}
		else if(clazz.equals(boolean.class) || clazz.equals(Boolean.class)) {
			return false;
		}
		else if(clazz.equals(byte.class) || clazz.equals(Byte.class)) {
			return Byte.valueOf(zero_byte);
		}
		else if(clazz.equals(java.math.BigDecimal.class) ) {
			return java.math.BigDecimal.valueOf(0);
		}
		else if(clazz.equals(java.math.BigInteger.class) ) {
			return java.math.BigInteger.valueOf(0);
		}
		else if(clazz.equals(List.class) ) {
			return new ArrayList<Object>();
		}
		else {
			return clazz.getDeclaredConstructor().newInstance();
		}		
	}
	
	
	/**根据函数名称查询Method（类中函数名不能有重名，不判断函数的参数）
	 * 
	 * @param clazz
	 * @param methodName
	 * @return 
	 * @author: wanghua
	 */
	public static Method getMethod(Class<?> clazz, String methodName) {
		Method[] methods = clazz.getDeclaredMethods(); //getMethod*()获取的是类的所有共有方法，这就包括自身的所有public方法，和从基类继承的、从接口实现的所有public方法。
		for(Method method : methods) {
			if(method.getName().equals(methodName)) {
				return method;
			}
		}
		return null;
	}
}
